/******************************************************************************/
/* whichdesktop.ccp : A part of Zzg Version 1.3                                                  */
/* A C++/Qt4 program : to plan scheduled computer shut down                   */
/* Ptyxs (Cassian Braconnier) - august 2010                                     */
/* Lic. GPLv3                                                                 */
/* Provided with no guaranty whatsoever.                                      */
/******************************************************************************/


//------------------------------------------------------------------------------

#include <QtCore>

//------------------------------------------------------------------------------

// initialisation d'un conteneur (map) associant le nom d'un processus
// caractéristique d'un certain bureau au nom de ce bureau
// key = processus / value = desktop
QMap<QString, QString> setMap(QMap<QString, QString>& map)
{
    map["enlightenment"] = "E17";
    map["eworkpanel"] = "EDE";
    map["gnome-session"] = "GNOME";
    map["icewm-session"] = "IceWM";
    map["lxsession"] = "LXDE";
    map["openbox"] = "Openbox";
    map["startkde"] = "KDE";
    map["wmaker"] = "WindowMaker";
    map["xfce4-session"] = "Xfce";

    return map;
}

//------------------------------------------------------------------------------

// permet de savoir si le processus dont le nom est passé en argument
// est en cours d'exécution
bool isRunning(QString processName)
{
    QString oneliner;
    oneliner =  "pidof -x " + processName; // -x pour avoir aussi le PID des scripts, comme startkde
qDebug() << "oneliner" << oneliner;
    QProcess process;
    process.start("/bin/bash", QStringList() << "-c" << oneliner);

    if ( ! process.waitForFinished() )
        qDebug() << oneliner + ": error";

    process.setReadChannel(QProcess::StandardOutput);
    QByteArray pid = process.readAll();
    qDebug() << "pid:" << pid;
    if ( pid != "" ) {
        qDebug() << "coin";
        return true;
    }
    else
        return false;
}

//------------------------------------------------------------------------------

// renvoie le nom du bureau s'il a été trouvé, sinon "unknown"
QString whichDesktop()
{

        QMap<QString,QString> mapProcessToDesktop;
        setMap(mapProcessToDesktop);

        QStringList keys = mapProcessToDesktop.keys(); // liste des processus


        typedef QStringList::const_iterator Cit;
        for(Cit it = keys.begin(); it != keys.end();  it++) { // on passe tous les processus
            // caractéristiques d'un bureau en revue et on cherche s'ils sont en cours d'exécution

            QString procName = (*it);
            qDebug() << procName;
            if (isRunning(procName)) {
                QString desktop = mapProcessToDesktop[procName];
qDebug() << "Le bureau est : "  << desktop;
                return desktop;
            }
        }

        return "unknown";
  }

//------------------------------------------------------------------------------
// END WHICHDESKTOP.CPP
